package net.ecpt.crm.services;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericEntityException;

public class ReadFromFile {
    /**
     * 以字节为单位读取文件，常用于读二进制文件，如图片、声音、影像等文件。
     */
    public static void readFileByBytes(String fileName) {
        File file = new File(fileName);
        InputStream in = null;
        try {
            System.out.println("以字节为单位读取文件内容，一次读一个字节：");
            // 一次读一个字节
            in = new FileInputStream(file);
            int tempbyte;
            while ((tempbyte = in.read()) != -1) {
                System.out.write(tempbyte);
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        try {
            System.out.println("以字节为单位读取文件内容，一次读多个字节：");
            // 一次读多个字节
            byte[] tempbytes = new byte[100];
            int byteread = 0;
            in = new FileInputStream(fileName);
            ReadFromFile.showAvailableBytes(in);
            // 读入多个字节到字节数组中，byteread为一次读入的字节数
            while ((byteread = in.read(tempbytes)) != -1) {
                System.out.write(tempbytes, 0, byteread);
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                }
            }
        }
    }

    /**
     * 以字符为单位读取文件，常用于读文本，数字等类型的文件
     */
    public static void readFileByChars(String fileName) {
        File file = new File(fileName);
        Reader reader = null;
        try {
            System.out.println("以字符为单位读取文件内容，一次读一个字节：");
            // 一次读一个字符
            reader = new InputStreamReader(new FileInputStream(file));
            int tempchar;
            while ((tempchar = reader.read()) != -1) {
                // 对于windows下，\r\n这两个字符在一起时，表示一个换行。
                // 但如果这两个字符分开显示时，会换两次行。
                // 因此，屏蔽掉\r，或者屏蔽\n。否则，将会多出很多空行。
                if (((char) tempchar) != '\r') {
                    System.out.print((char) tempchar);
                }
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            System.out.println("以字符为单位读取文件内容，一次读多个字节：");
            // 一次读多个字符
            char[] tempchars = new char[30];
            int charread = 0;
            reader = new InputStreamReader(new FileInputStream(fileName));
            // 读入多个字符到字符数组中，charread为一次读取字符数
            while ((charread = reader.read(tempchars)) != -1) {
                // 同样屏蔽掉\r不显示
                if ((charread == tempchars.length)
                        && (tempchars[tempchars.length - 1] != '\r')) {
                    System.out.print(tempchars);
                } else {
                    for (int i = 0; i < charread; i++) {
                        if (tempchars[i] == '\r') {
                            continue;
                        } else {
                            System.out.print(tempchars[i]);
                        }
                    }
                }
            }

        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
    }

    /**
     * 以行为单位读取文件，常用于读面向行的格式化文件
     */
    public static void readFileByLines(String fileName) {
        File file = new File(fileName);
        BufferedReader reader = null;
        try {
            System.out.println("以行为单位读取文件内容，一次读一整行：");
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读入一行，直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
                System.out.println("line " + line + ": " + tempString);
                line++;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
    }
    
    
    public static List readFileByLinesToList(String fileName) {
    	List list =new ArrayList();
        File file = new File(fileName);
        BufferedReader reader = null;
        try {
            //System.out.println("以行为单位读取文件内容，一次读一整行：");
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读入一行，直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
                //System.out.println("line " + line + ": " + tempString);
                list.add(tempString);
                line++;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
        
        return list;
    }

    /**
     * 随机读取文件内容
     */
    public static void readFileByRandomAccess(String fileName) {
        RandomAccessFile randomFile = null;
        try {
            System.out.println("随机读取一段文件内容：");
            // 打开一个随机访问文件流，按只读方式
            randomFile = new RandomAccessFile(fileName, "r");
            // 文件长度，字节数
            long fileLength = randomFile.length();
            // 读文件的起始位置
            int beginIndex = (fileLength > 4) ? 4 : 0;
            // 将读文件的开始位置移到beginIndex位置。
            randomFile.seek(beginIndex);
            byte[] bytes = new byte[10];
            int byteread = 0;
            // 一次读10个字节，如果文件内容不足10个字节，则读剩下的字节。
            // 将一次读取的字节数赋给byteread
            while ((byteread = randomFile.read(bytes)) != -1) {
                System.out.write(bytes, 0, byteread);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (randomFile != null) {
                try {
                    randomFile.close();
                } catch (IOException e1) {
                }
            }
        }
    }

    /**
     * 显示输入流中还剩的字节数
     */
    private static void showAvailableBytes(InputStream in) {
        try {
            System.out.println("当前字节输入流中的字节数为:" + in.available());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
//        String fileName = "C:/temp/newTemp.txt";
//        ReadFromFile.readFileByBytes(fileName);
//        ReadFromFile.readFileByChars(fileName);
//        ReadFromFile.readFileByLines(fileName);
//        ReadFromFile.readFileByRandomAccess(fileName);
        
        collideCustomerName();
    }
    
    private static void collideCustomerName() {
    	List list2 =new ArrayList();
    	
    	 String fileName = "D:\\workspace\\eim_server\\applications\\crm\\data\\companyname";
    	 List list1 =readFileByLinesToList(fileName);
    	 List collideTypeList =listCollideType();
    	 for(int i=0;i<list1.size();i++) {
    		 String ss= (String) list1.get(i);
    		 for(int j=0;j<collideTypeList.size();j++) {
    			 String collideType= (String) collideTypeList.get(j);
    			 ss=ss.replace(collideType, "");
    		 }
    		 list2.add(ss);
    		// System.out.println(i +":" + ss);
    	 }
    	 
    	 Map dataCollection=new HashMap();
    	 
    	 for(int j=0;j<list2.size();j++) {
			 String s2= (String) list2.get(j);
			 Map newData=new HashMap();
			 newData.put("id", s2);
			 dataCollection =addDataCollection(dataCollection, newData);
		 }
    	// List list3 =new ArrayList();
    	// list3 =(List) dataCollection.values();
    	 
    	 Collection valueCollection = dataCollection.values();
    	 List<Map> list3 = new ArrayList<Map>(valueCollection);
    	 // 按照数量进行排序
 	    Collections.sort(list3, new Comparator<Map>() {
 		@Override
 		public int compare(Map obj1, Map obj2) {
 		    // int i =
 		    // ((Integer)obj1.get("businessNum")).compareTo((Integer)obj2.get("businessNum"));//正序
 		    int i = ((Integer) obj2.get("collideNum")).compareTo((Integer) obj1.get("collideNum"));
 		    return i;// 这里返回的只是一个int类型的数据
 		}
 	    });
 	    
 	    
	 	   for(int i=0;i<list3.size();i++) {
	  		 Map ss= (Map) list3.get(i);
	  		 
	  		 System.out.println(i +":" + ss);
	  	   }
    	 
    }
    
    
    private static Map addDataCollection( Map dataCollection, Map newData) {
    	Map result = dataCollection;
    	String newId = (String) newData.get("id");

    	if (UtilValidate.isEmpty(dataCollection.get(newId))) {
    	    Map oldData = new HashMap();
    	    oldData.put("id", newId);
    	    oldData.put("collideNum", 1);

    	    result.put(newId, oldData);
    	} else {
    	    Map putData = new HashMap();
    	    Map oldData = (Map) dataCollection.get(newId);
    	    putData.putAll(oldData);
    	    int collideNum = (int) oldData.get("collideNum") + 1;
    	    putData.put("collideNum", collideNum);
    	    result.put(newId, putData);
    	}
    	return result;

        }
    
    
    public static List  listCollideType() {
    	List collideTypeList =new ArrayList();
    	
    	collideTypeList.add("科技");
    	collideTypeList.add("食品");
    	collideTypeList.add("有限公司");
    	collideTypeList.add("有限责任公司");
    	collideTypeList.add("分公司");
    	collideTypeList.add("乳业");
    	collideTypeList.add("餐饮");
    	collideTypeList.add("贸易");
    	collideTypeList.add("集团");
    	collideTypeList.add("国际");
    	collideTypeList.add("股份");
    	collideTypeList.add("实业");
    	collideTypeList.add("发展");
    	
    	collideTypeList.add("供应链");
    	collideTypeList.add("农业");
    	collideTypeList.add("生态");
    	collideTypeList.add("电子商务");
    	collideTypeList.add("电商");
    	collideTypeList.add("进出口");
    	
    	collideTypeList.add("百货");
    	collideTypeList.add("物流");
    	collideTypeList.add("信息");
    	collideTypeList.add("冷链");
    	collideTypeList.add("生鲜");
    	collideTypeList.add("管理");
    	collideTypeList.add("商业");
    	collideTypeList.add("超市");
    	collideTypeList.add("国际");
    	
    	collideTypeList.add("国际");
    	collideTypeList.add("便利店");
    	
    	collideTypeList.add("数字技术");
    	collideTypeList.add("世界技术");
    	
    	collideTypeList.add("（");
    	collideTypeList.add("）");
    	
    	collideTypeList.add("代表处");
    	
    	collideTypeList.add("内蒙古");
    	collideTypeList.add("四川");
    	collideTypeList.add("广东");
    	collideTypeList.add("浙江");
    	
    	
    	collideTypeList.add("上海");
    	
    	collideTypeList.add("北京");
    	
    	collideTypeList.add("中国");
    	
    	collideTypeList.add("深圳市");
    	collideTypeList.add("深圳");
    	collideTypeList.add("天津市");
    	collideTypeList.add("天津");
    	collideTypeList.add("广州市");
    	collideTypeList.add("广州");
    	
    	collideTypeList.add("郑州市");
    	collideTypeList.add("郑州");
    	
    	collideTypeList.add("杭州市");
    	collideTypeList.add("杭州");
    	collideTypeList.add("惠洲市");
    	collideTypeList.add("惠洲");
    	collideTypeList.add("大连市");
    	collideTypeList.add("大连");
    	
    	
    	collideTypeList.add("重庆市");
    	collideTypeList.add("重庆");
    	
    	collideTypeList.add("武汉市");
    	collideTypeList.add("武汉");
    	
    	
    	
    	collideTypeList.add("成都市");
    	collideTypeList.add("成都");
    	collideTypeList.add("青岛市");
    	collideTypeList.add("青岛");
    	collideTypeList.add("长沙市");
    	collideTypeList.add("长沙");
    	collideTypeList.add("沈阳市");
    	collideTypeList.add("沈阳");
    	
    	collideTypeList.add("西安市");
    	collideTypeList.add("西安");
    	
    	
    	
    	return collideTypeList;
    }
    
    
}
//复制代码
//
//5、将内容追加到文件尾部
//
//复制代码
//public class AppendToFile {
//    /**
//     * A方法追加文件：使用RandomAccessFile
//     */
//    public static void appendMethodA(String fileName, String content) {
//        try {
//            // 打开一个随机访问文件流，按读写方式
//            RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
//            // 文件长度，字节数
//            long fileLength = randomFile.length();
//            //将写文件指针移到文件尾。
//            randomFile.seek(fileLength);
//            randomFile.writeBytes(content);
//            randomFile.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * B方法追加文件：使用FileWriter
//     */
//    public static void appendMethodB(String fileName, String content) {
//        try {
//            //打开一个写文件器，构造函数中的第二个参数true表示以追加形式写文件
//            FileWriter writer = new FileWriter(fileName, true);
//            writer.write(content);
//            writer.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    public static void main(String[] args) {
//        String fileName = "C:/temp/newTemp.txt";
//        String content = "new append!";
//        //按方法A追加文件
//        AppendToFile.appendMethodA(fileName, content);
//        AppendToFile.appendMethodA(fileName, "append end. \n");
//        //显示文件内容
//        ReadFromFile.readFileByLines(fileName);
//        //按方法B追加文件
//        AppendToFile.appendMethodB(fileName, content);
//        AppendToFile.appendMethodB(fileName, "append end. \n");
//        //显示文件内容
//        ReadFromFile.readFileByLines(fileName);
//    }
//}